# -*- coding: UTF-8 -*-
from __future__ import unicode_literals
__author__ = 'Jinkey'


import jieba,re
import nltk

import sys   # 引用sys模块进来，并不是进行sys的第一次加载
reload(sys)  # 重新加载sys
sys.setdefaultencoding('utf8')  # 调用setdefaultencoding函数

# 中文句子
chinese_origin = '金秋十月，水天澄碧。在中华人民共和国第６６个国庆日到来前夕，习近平总书记在人民大会堂亲切会见了１３位民族团结优秀代表，向他们致以节日的祝贺，勉励他们继续当好民族团结的使者。民族团结是各族人民的生命线。党的十八大以来，以习近平同志为总书记的党中央把握党和国家事业发展对民族工作提出的时代命题，作出一系列领引当代、惠及千秋的重大决策部署。继往开来的新理念、新政策、新举措，为民族团结进步事业全面发展指明了方向。在以习近平同志为总书记的党中央坚强领导下，全国各族人民砥砺同心，民族地区经济社会发展实现了历史性跨越；团结奋进，亿万中华儿女在实现民族伟大复兴中国梦的大道上阔步前行.'
# 英文句子
english_origin = 'hello shirley, are you kinding me? Shirley, I am JJ'


# =================================================================
# 中文分词
chineses_cuts = jieba.cut(chinese_origin, cut_all=False) # 传入str
chineses = []
for cut in chineses_cuts:
    chineses.append(cut)

# 英文分词
english_origin = english_origin.lower()
# english_clear = re.sub(u"[,.]", "", english_origin.decode("u8")) # 清除句子中的标点符号
# english_cuts = english_clear.split(' ')
# englishs = []
# for cut in english_cuts:
#     englishs.append(cut)
english_cuts = nltk.word_tokenize(english_origin)
englishs = []
for cut in english_cuts:
    englishs.append(cut)


# =================================================================
# 文档化
chinese2text = nltk.Text(chineses)  # 传入list
from nltk.book import text1
english2text = text1

#
# # =================================================================
# # 单个词语精确查找
# print '==================================单个词语精确查找结果'
# print chinese2text.concordance(u'习近平')
# print english2text.concordance('monstrous')
#
# # 单个词语模糊查找
# print '==================================单个词语模糊查找结果'
# print chinese2text.similar(u'平')
# print english2text.similar('monstrous')
#
# # 多个词语精确查找
# print '==================================多个词语模糊查找结果'
# print chinese2text.common_contexts([u'习近平',u'人民大会堂'])
# print english2text.common_contexts(['monstrous', 'very'])
#
#
# # =================================================================
# # 词语分布离散图
# chinese2text.dispersion_plot([u'习近平',u'人民大会堂'])
# english2text.dispersion_plot(['monstrous', 'very'])
#
#
# # =================================================================
# # 产生随机文本
# # print chinese2text.generate()
# # print english2text.generate()
#
#
# # =================================================================
# # 文本统计
#
# # 词汇计数
# print '中文句子单词数为：'
# print len(chinese2text)
# print '英文句子单词数为：'
# print len(english2text)
#
# # 频数统计
# chinese_frequency = nltk.FreqDist(chinese2text)  # 实例化统计器
# english_frequency = nltk.FreqDist(english2text)
# print '==================================常用频数统计函数'
# print chinese_frequency.max()  # 查找最高频词汇
#
# print chinese_frequency.keys()[:20]  # 前20个高频词的键
# print english_frequency.values()[:20]  # 前20个高频词的值
# print english_frequency.items()[:20]  # 前20个高频词的键值对
#
# print chinese_frequency[u'习近平']  # 某个词的频数
# print chinese_frequency.freq(u'习近平')  # 某个词的频率
#
# print chinese_frequency.N()  # 样本总数
#
# chinese_frequency.plot(20, cumulative=True)  # 前20个词语的累积频数分布图
# english_frequency.plot(20)  # 前20个词语的频数分布图
# print english_frequency.tabulate(20)  # 前20个词语的频率分布表
#
# # 条件频数统计
# words = [('JJ','boy'),('zhuzhu','girl'),('sb','boy'),('junjun','girl'),('sb2','boy')]
# # 实例化的时候前面的参数为条件conditon，第二个参数为例子example
# ConditionalFreq = nltk.ConditionalFreqDist((gender,name) for (name,gender) in words)
# # 获取条件值集合
# print ConditionalFreq.conditions()
# # 按条件分类统计
# print dict((gender,ConditionalFreq[gender].keys()[:5]) for gender in ConditionalFreq.conditions())
#

# # =================================================================
# # 按条件筛选词汇
# print '==================================按条件筛选词汇'
# # 筛选词长度大于5，频次大于7d饿单词
# print sorted([word for word in set(english2text) if len(word) > 5 and english_frequency[word] > 6])
# # 上面表达式中的set函数是将列表（有重复）变成集合（无重复）
# print ['a','a','a','b']
# print set(['a', 'a', 'a', 'b'])
#
#
# # =================================================================
# # 搭配
# for bigram in nltk.bigrams([u'北京', u'大学',u'生']):
#     print bigram
# # 双连词
# english2text.collocations()
#
#
# # =================================================================
# # python自带文本判别函数
# english_origin.startswith('s')
# english_origin.endswith('s')
# english_origin.isalnum()  # 是否都是数字或字母
# english_origin.isalpha()  # 是否都是字母
# english_origin.isdigit()  # 是否都是数字
# english_origin.islower()  # 是否小写
# english_origin.isupper()  # 是否大写
# english_origin.isspace()  #
# english_origin.istitle()  # 是否首字母大写
#
#
# # =========================================================WordNet语义网络
# print '==================================WordNet语义网络'
# from nltk.corpus import wordnet
# # 查找同义词
# print wordnet.synsets('human')
# print wordnet.synset('homo.n.02').lemma_names()
#
# # 查看定义
# print wordnet.synset('homo.n.02').definition()
#
# # 下位词
# print sorted([lemma for lemma in synset.lemma_names()] for synset in wordnet.synset('homo.n.02').hyponyms())
# # 上位词
# print wordnet.synset('homo.n.02').hypernyms()
# # 上位路径
# print wordnet.synset('homo.n.02').hypernym_paths()
# # 根上位词
# print wordnet.synset('homo.n.02').root_hypernyms()
#
# # 组成该名词实体的各部分
# print wordnet.synset('homo.n.02').part_meronyms()
# # 组成该名词实体的实质
# print wordnet.synset('homo.n.02').substance_meronyms()
# # 很多该名词实体组成的更大的名词实体
# print wordnet.synset('homo.n.02').member_holonyms()
#
# # 组成该动词动作的各动作
# print wordnet.synset('eat.v.01').entailments()
#
# # 反义词
# print wordnet.synset('good.a.01').lemmas()[0].antonyms()
#
# # 找到两个词义的"最小公约数"
# print wordnet.synset('car.n.01').lowest_common_hypernyms(wordnet.synset('bike.n.01'))
# # 深度量化
# print wordnet.synset('homo.n.02').min_depth()
# # 语义相似度
# print wordnet.synset('car.n.01').path_similarity(wordnet.synset('bike.n.01'))
#

# =========================================================文本处理
print u'==================================文本处理'.encode('gb18030')
# 反向查找
print english_origin.rfind('JJ')

# 正则匹配
print english2text.findall(r"<I><am>(<.*>)")

# 词干提取器
porter_stemmer = nltk.PorterStemmer()
print porter_stemmer.stem('loving')

# 词形归并
wnl = nltk.WordNetLemmatizer()
print [wnl.lemmatize(word) for word in ['loving','women','sports','masses','ponds']]

# 正则表达式分词器
print nltk.regexp_tokenize(english_origin,r"(?x)[a-zA-Z]+")

# 断句
print nltk.sent_tokenize(english_origin)

# 为那些词的边界没有任何视觉表示的书写系统分词
import annealing_algorithm
text = "doyoulovemewheniwasachildiloveyouwheniwasyounghewasalsoloveyouandyouwerelovehimwhenyouwereyoung"
# aa = annealing_algorithm.AnnealingText(text)
# aa.anneal(20000,1.1)


# =========================================================词性标注
print '==================================词性标注'
# 词性
print nltk.pos_tag(englishs)

# 字符转元组
print nltk.tag.str2tuple('fly/NN')

# 读取已标注词性（这样格式的'fly/NN')的语料库
print nltk.corpus.brown.tagged_words()

# 默认标注器(所有词都标注成同一个词性)
default_tagger = nltk.DefaultTagger('NN')
print default_tagger.tag(englishs)

# 正则标注器(某个前缀或者后缀的词为一个词性)
patterns = [(r'.*ing','VBG'), (r'.*ed$','VBD')]  # ing结尾的词为现在分词，ed结尾的为过去分词
regexp_tagger = nltk.RegexpTagger(patterns)
print regexp_tagger.tag(englishs)

# 查询标注器(建立词-标注映射关系模型，遇到这些词的时候查表得到标注的值)
# 随着模型规模增长，最初性能迅速增加之后达到稳定水平
frequency = nltk.FreqDist(nltk.corpus.brown.words(categories='news'))  # 统计词频
conditional_frequency = nltk.ConditionalFreqDist(nltk.corpus.brown.tagged_words(categories='news'))
likely_tags = dict((word,conditional_frequency[word].max()) for word in frequency.keys()[:100])
print nltk.UnigramTagger(model=likely_tags, backoff=nltk.DefaultTagger('NN'))  # 没有命中查询表的单词就回退到默认标注器

print '==================================n-gram标注器'
# N-gram标注(上下文是当前词和它前面的n-1个词的词性标记)
# 1-gram就是查询标注器
# 2-gram
bigram_tagger = nltk.BigramTagger()
# 评估标注了多少个词
# tagger.evaluate(文档)